#include "stm32f10x.h"                  // Device header

uint32_t MySize;

void MyDMA_Init(uint32_t AddressA,uint32_t AddressB,uint32_t Size)
{
	MySize = Size;
	//开启DMA时钟，DMA是AHB上的外设
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	
	//初始化DMA结构体
	DMA_InitTypeDef DMA_InitStruct;
	//外设的配置
	DMA_InitStruct.DMA_PeripheralBaseAddr = AddressA;						//外设起始地址，需要一个uint32_t类型的变量，这个是规定，所以这个地方传进来的是uint32_t
	DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;	//传递字节的大小，
	DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;			//是否自增
	//存储器的配置
	DMA_InitStruct.DMA_MemoryBaseAddr = AddressB;							//存储器起始地址
	DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;	
	DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
	
	DMA_InitStruct.DMA_BufferSize = Size;									//DMA_BufferSize就是传输计数器的值，也是uint32_t，但是他都内部大小只有16位
	DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;							//DIR就是方向，看是从外设到存储器，还是从存储器到外设，SRC就是外设是来源，DST就是destination，外设是目的地
	DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;								//M2M就是 是否是 软件触发
	DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;								//Mode是自动重装的模式，需不需要自动重装，DMA_Mode_Normal就是不需要，DMA_Mode_Circular就是需要，循环
	DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;						//优先级，这里不一定需要那么高的优先级，随便配置的
	
	DMA_Init(DMA1_Channel1,&DMA_InitStruct);								//因为是软件触发，所以这里是随便一个通道都可以
	
	DMA_Cmd(DMA1_Channel1,DISABLE);
}

/**
  * 函    数：启动DMA数据转运
  * 参    数：无
  * 返 回 值：无
  */
void MyDMA_Doing(void)
{
	DMA_Cmd(DMA1_Channel1,DISABLE);											//上面是配置DMA的一次
	DMA_SetCurrDataCounter(DMA1_Channel1,MySize);
	DMA_Cmd(DMA1_Channel1,ENABLE);
	
	while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);						//获取DMA_GetFlagStatus标志位，有很多，这个DMA1_FLAG_TC1是转运完成的标志位，转运完成会置1，需要软件清零
	DMA_ClearFlag(DMA1_FLAG_TC1);											//软件清零
	
}
